/*
 * @lc app=leetcode.cn id=24 lang=cpp
 *
 * [24] 两两交换链表中的节点
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
 public:
  /*ListNode* swapPairs(ListNode* head) {
      if(!head) return NULL;
      auto hummy = head;
      for(auto p=head;p&&p->next&&p->next->next;p=p->next)
      {
        head = p->next;
        p->next=p->next->next;
        p->next->next=p;
      }
  }*/

  ListNode* swapPairs(ListNode* head)
  {
    auto dummy = new ListNode(-1);
    dummy->next = head;

    // p->next是a, p->next->next是b,保证a,b都存在
    for (auto p = dummy; p->next && p->next->next;)
    {
      auto a = p->next, b = a->next;
      p->next = b;
      a->next = b->next;
      b->next = a;
      p = a;
    }

    return dummy->next;
  }
};
// @lc code=end
